package tool.dialog;

import java.awt.Color;

import javax.swing.JTextField;

/**rappresenta un TextField con servizi che consentono di verificare immediatamente
 * se al suo interno e' presente un testo rappresentante un numero intero. Inoltre
 * la classe possiede 2 "stati":
 * <p>
 * <ul>
 *  <li>uno rappresentante la situazione di normalita', quello cioe' in cui l'utente
 *  ancora scrivendo all'interno del componente</li>
 *  <li>uno rappresentante la situazione di errore, quello cioe' in cui
 *  l'utente ha smesso di scrivere e, tramite un meccanismo implementato a livello
 *  utente (come la pressione di un pulsante), il software ha capito che l'utente
 *  all'interno del TextField ha inserito una stringa non convertibile in un numero</li>
 * </ul>
 * <p>Questi 2 stati non sono definiti attraverso alcun attributo dentro questa classe:
 * essi piuttosto possono essere richiamabili tramite i metodi {@link #setErrorState()} e
 * {@link #setDefaultState()}. Inoltre la classe non offre alcun meccanismo di riconoscimento
 * automatico degli errori nel TextFIeld, ma delega il meccanismo al livello utente.
 * <p>Quello che la classe offre, sono routine di verifica immediata del contenuto
 * del TextFIeld, come ad esempio {@link #isNumber()} o {@link #containsNumber()}  
 * 
 * @author Koldar
 * @version 1.0
 */
public class JNumberTextField extends JTextField{

	private static final long serialVersionUID = 5605274611302190157L;
	/**rappresenta il colore che assume lo sfondo quando al TextField viene comandandato di assumere uno stato di normalita'*/
	private Color defaultColor;
	/**rappresenta il colore che assume lo sfondo quando al TextField viene comandato di assumere uno stato di errore*/
	private Color errorColor; 
	
	public JNumberTextField(String startstr,Color defaultcolor,Color errorcolor){
		super(startstr);
		this.defaultColor=defaultcolor;
		this.errorColor=errorcolor;
	}
	public JNumberTextField(String startstr,Color errorcolor){
		this(startstr,Color.WHITE,errorcolor);
	}
	public JNumberTextField(String startstr){
		this(startstr,Color.RED);
	}
	public JNumberTextField(){
		this("");
	}
	
	/**imposta lo sfondo del TextField con il colore di errore
	 * 
	 */
	public void setErrorState(){
		this.setBackground(errorColor);
	}
	/**imposta lo sfondo del TextField con il colore di default
	 * 
	 */
	public void setDefaultState(){
		this.setBackground(defaultColor);
	}
	
	/**
	 * @return the defaultColor
	 */
	public Color getDefaultColor() {
		return defaultColor;
	}


	/**
	 * @param defaultColor the defaultColor to set
	 */
	public void setDefaultColor(Color defaultColor) {
		this.defaultColor = defaultColor;
	}


	/**
	 * @return the errorColor
	 */
	public Color getErrorColor() {
		return errorColor;
	}


	/**
	 * @param errorColor the errorColor to set
	 */
	public void setErrorColor(Color errorColor) {
		this.errorColor = errorColor;
	}


	/**verifica se la stringa contenuta all'interno del TextField e' un numero (intero) oppure no
	 * 
	 * @return TRUE in caso di intero relativo; FALSE altrimenti
	 */
	public boolean isNumber(){
		String str=this.getText();
		try{
			Integer.parseInt(str);
		}catch (Exception error){
			return false;
		}
		return true;
	}
	/**verifica se la stringa contenuta all'interno del TextField e' un numero (intero)
	 * oppure no.
	 * 
	 * @return il numero contenuto nel TextField, o NULL se all'interno non ne e' presente alcuno
	 */
	public Integer containsNumber(){
		String str=this.getText();
		int result;
		try{
			result=Integer.parseInt(str);
		}catch (Exception error){
			return null;
		}
		return result;
	}
	
	/**
	 * 
	 * @return il numero inserito come stringa all'interno del TExtField
	 * @throws NumberFormatException in caso in cui la stringa contenuta non rappresenti un numero
	 */
	public int containsUnsafeNumber() throws NumberFormatException{
		String str=this.getText();
		int result;
		try{
			result=Integer.parseInt(str);
		}catch (Exception error){
			throw new NumberFormatException();
		}
		return result;
	}

}
